"""
配置管理模块

提供统一的配置管理功能，支持YAML配置文件读取、验证和热重载。
"""

import os
import yaml
from pathlib import Path
from typing import Any, Dict, Optional, Union
import logging

logger = logging.getLogger(__name__)


class ConfigManager:
    """配置管理器类"""
    
    def __init__(self, config_file: Optional[str] = None):
        """
        初始化配置管理器
        
        Args:
            config_file: 配置文件路径，默认为config/settings.yaml
        """
        if config_file is None:
            config_file = Path(__file__).parent.parent.parent / "config" / "settings.yaml"
        
        self.config_file = Path(config_file)
        self._config: Dict[str, Any] = {}
        self._load_config()
    
    def _load_config(self) -> None:
        """加载配置文件"""
        try:
            if self.config_file.exists():
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    self._config = yaml.safe_load(f) or {}
                logger.info(f"配置文件加载成功: {self.config_file}")
            else:
                logger.warning(f"配置文件不存在: {self.config_file}")
                self._config = self._get_default_config()
        except Exception as e:
            logger.error(f"加载配置文件失败: {e}")
            self._config = self._get_default_config()
    
    def _get_default_config(self) -> Dict[str, Any]:
        """获取默认配置"""
        return {
            'app': {
                'name': '香港疫情数据仪表板',
                'version': '1.0.0',
                'debug': False
            },
            'data': {
                'input_dir': 'data/raw',
                'output_dir': 'data/output',
                'charts_dir': 'data/output/charts',
                'reports_dir': 'data/output/reports'
            },
            'charts': {
                'style': 'default',
                'dpi': 300,
                'format': 'png',
                'width': 12,
                'height': 8
            },
            'gui': {
                'window_width': 1200,
                'window_height': 800,
                'theme': 'light'
            },
            'logging': {
                'level': 'INFO',
                'file': 'logs/app.log',
                'max_size': 10 * 1024 * 1024,  # 10MB
                'backup_count': 5
            },
            'fonts': {
                'chinese_font': 'SimHei',
                'english_font': 'Arial',
                'size': 12
            }
        }
    
    def get(self, key: str, default: Any = None) -> Any:
        """
        获取配置值
        
        Args:
            key: 配置键，支持点号分隔的多级键
            default: 默认值
            
        Returns:
            配置值
        """
        keys = key.split('.')
        value = self._config
        
        try:
            for k in keys:
                value = value[k]
            return value
        except (KeyError, TypeError):
            return default
    
    def set(self, key: str, value: Any) -> None:
        """
        设置配置值
        
        Args:
            key: 配置键，支持点号分隔的多级键
            value: 配置值
        """
        keys = key.split('.')
        config = self._config
        
        # 创建嵌套结构
        for k in keys[:-1]:
            if k not in config:
                config[k] = {}
            config = config[k]
        
        config[keys[-1]] = value
        logger.info(f"配置已更新: {key} = {value}")
    
    def save(self) -> None:
        """保存配置到文件"""
        try:
            self.config_file.parent.mkdir(parents=True, exist_ok=True)
            with open(self.config_file, 'w', encoding='utf-8') as f:
                yaml.dump(self._config, f, default_flow_style=False, 
                         allow_unicode=True, indent=2)
            logger.info(f"配置已保存到: {self.config_file}")
        except Exception as e:
            logger.error(f"保存配置文件失败: {e}")
    
    def reload(self) -> None:
        """重新加载配置文件"""
        self._load_config()
        logger.info("配置文件已重新加载")
    
    def get_all(self) -> Dict[str, Any]:
        """获取所有配置"""
        return self._config.copy()
    
    def validate(self) -> bool:
        """
        验证配置的有效性
        
        Returns:
            配置是否有效
        """
        required_keys = [
            'app.name',
            'app.version',
            'data.input_dir',
            'data.output_dir',
            'charts.style',
            'gui.window_width',
            'gui.window_height'
        ]
        
        for key in required_keys:
            if self.get(key) is None:
                logger.error(f"缺少必需的配置项: {key}")
                return False
        
        return True


# 全局配置管理器实例
config_manager = ConfigManager()


def get_config(key: str, default: Any = None) -> Any:
    """
    获取配置值的便捷函数
    
    Args:
        key: 配置键
        default: 默认值
        
    Returns:
        配置值
    """
    return config_manager.get(key, default)


def set_config(key: str, value: Any) -> None:
    """
    设置配置值的便捷函数
    
    Args:
        key: 配置键
        value: 配置值
    """
    config_manager.set(key, value)


def save_config() -> None:
    """保存配置的便捷函数"""
    config_manager.save()


def reload_config() -> None:
    """重新加载配置的便捷函数"""
    config_manager.reload() 